Event.observe(window, "load", function() {

    abonnerChqForm("form.inscription");

    /**
     * Définit l'action à effectuer lorsqu'un des boutons
     * relatifs au solveur est cliqué.
     */
    $("btVerifier").onclick = requeteVerification;
    $("btResoudre").onclick = requeteResolution;

});

function abonnerChqForm(selectors) {
    $$(selectors).each(function(form) {
        form.onsubmit = affecterGrpOnSubmit;
        // en outre, on enlève l'option "--sélectionnez--" de la liste
        // déroulante s'il n'y a aucun groupe à affecter
        var select = form.down("select.groupes");
        if(select.options.length == 1 && $F(select) === "")
            select.options[0] = null;
    });
}

function affecterGrpOnSubmit(ev) {

    var idConteneur = $(this).up(".module").id;
    var idGrpSel = $F(this["idGroupe"]);
    if(idGrpSel != null && idGrpSel != "") {
        new Ajax.Updater(
            idConteneur,
            this.getAttribute("action"),
            {
                method: "post",
                postBody: this.serialize(),
                onComplete: function() {
                    abonnerChqForm("#"+idConteneur+" form.inscription");
                    var form = $(idConteneur).down("form.inscription");
                    form.down("select.groupes").focus();
                }
            }
        );
    }
    else {
        alert("Veuillez sélectionner un groupe.");
    }
    Event.stop(ev);
}

function enleverGrp(idModule, idPrest, idGroupe) {

    new Ajax.Updater(
        ("module"+idModule),
        "GererAffectationsGrp.do?action=enleverGrp",
        {
            parameters: {"idModule": idModule,
                         "idPrestation": idPrest,
                         "idGroupe": idGroupe},
            onComplete: function() {
                abonnerChqForm("#module"+idModule+" form.inscription");
                var form = $("module"+idModule).down("form.inscription");
                form.down("select.groupes").focus();
            }
        }
    );
}

/**
 * Exécute une requête AJAX qui va lancer une vérification sur le serveur,
 * et retourner la liste des éventuels conflits trouvés.
 */
function requeteVerification() {
    new Ajax.Updater (
        "msgResolution",
        "UtiliserSolveur.do?action=verifierCoherenceEDT",
        {
            asynchronous: true,
            onCreate: function() {
                bloquerEnvoiFormInscript();
                $("animationAttente").show();
            },
            onComplete: function() {
                debloquerEnvoiFormInscript();
                new Effect.BlindUp("animationAttente");
                new Effect.Shake("msgResolution");
            }
        }
    );
}

/**
 * Exécute une requête AJAX qui va lancer la résolution du problème
 * de l'emploi du temps sur le serveur. L'affichage de l'EDT sera
 * actualisé si la résolution a réussi.
 */
function requeteResolution() {
    new Ajax.Updater (
        "msgResolution",
        "UtiliserSolveur.do?action=resoudreEDT",
        {
            asynchronous: true,
            onCreate: function() {
                bloquerEnvoiFormInscript();
                $("animationAttente").show();
            },
            onComplete: function() {
                if($("estResolu")) {
                    window.location = "GererAffectationsGrp.do?action=afficher&resolu=1";
                }
                else {
                    debloquerEnvoiFormInscript();
                    new Effect.BlindUp("animationAttente");
                    new Effect.Shake("msgResolution");
                }
            }
        }
    );
}

function bloquerEnvoiFormInscript() {
    $$("form.inscription").each(function(form) {
        if(form.onsubmit) {
            form.onsubmitcallbak = form.onsubmit;
            form.onsubmit = function(evt) {
                Event.stop(evt);
            };
        }
    });
}

function debloquerEnvoiFormInscript() {
    $$("form.inscription").each(function(form) {
        if(form.onsubmitcallbak)
            form.onsubmit = form.onsubmitcallbak;
    });
}
